/*******************************************************************************
** 文件名称：bell.c
** 文件作用：蜂鸣器
** 编写作者：Tom Free 付瑞彪
** 编写时间：2021-05-30
** 文件备注：
** 更新记录：
**           2021-05-30 -> 创建文件
**                                                            <Tom Free 付瑞彪>
**
**           Copyright (c) 2018-2021 付瑞彪 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/

#include "bell.h"
#include "timer2.h"

/* 蜂鸣器参数结构 */
typedef struct
{
    bool playing;
    uint8_t cnt;
    uint8_t interval;
    uint8_t interval_cnt;
} bell_args_t;

/* 蜂鸣器参数 */
static bell_args_t bell_args;

/* 初始化 */
void bell_init(void)
{
    /* 关闭定时器 */
    timer2_deinit();
    /* 清除参数 */
    bell_args.cnt = 0;
    bell_args.interval = 1;
    bell_args.interval_cnt = 0;
    bell_args.playing = false;
}

/* 强制停止播放 */
void bell_stop(void)
{
    bell_init();
}

/* 开始播放，interval - 间隔时间，单位：10ms，cnt - 滴次数 */
void bell_play(uint8_t interval, uint8_t cnt)
{
    if ((!cnt) || (cnt > 127) || (!interval))
    {
        return;
    }

    /* 关闭定时器 */
    timer2_deinit();
    /* 清除播放标志 */
    bell_args.playing = false;
    /* 设置播放次数 */
    bell_args.cnt = cnt * 2;
    /* 设置间隔 */
    bell_args.interval = interval;
    /* 启动间隔计数 */
    bell_args.interval_cnt = 0;
}

/* 轮询函数，每10ms轮一次 */
void bell_poll(void)
{
    if (bell_args.cnt)
    {
        if (bell_args.interval_cnt)
        {
            bell_args.interval_cnt--;
            return;
        }
        bell_args.interval_cnt = bell_args.interval;
        bell_args.cnt--;
        if (bell_args.playing)
        {
            /* 关闭定时器 */
            timer2_deinit();
            /* 清除播放标志 */
            bell_args.playing = false;
        }
        else
        {
            /* 开启定时器 */
            timer2_init();
            /* 置位播放标志 */
            bell_args.playing = true;
        }
    }
    else if (bell_args.playing)
    {
        /* 关闭定时器 */
        timer2_deinit();
        /* 清除播放标志 */
        bell_args.playing = false;
    }
}
